iommu/amd: Fix logic for clearing the IOMMU interrupt bits
authorSuravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Tue, 2 Jul 2013 06:49:43 +0000 (08:49 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 2 Jul 2013 06:49:43 +0000 (08:49 +0200)
commit2823a0c7dfc979db316787e1dd42a8845e5825c0
tree1d405efec58ff5fadcb2e1901ff26510c71a7526
parent5ad914bc867c5a6a4957869c89918f4e1f9dd9c4
iommu/amd: Fix logic for clearing the IOMMU interrupt bits

The IOMMU interrupt bits in the IOMMU status registers are
"read-only, and write-1-to-clear (RW1C).  Therefore, the existing
logic which reads the register, set the bit, and then writing back
the values could accidentally clear certain bits if it has been set.

The correct logic would just be writing only the value which only
set the interrupt bits, and leave the rest to zeros.

This patch also, clean up #define masks as Jan has suggested.

Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
With iommu_interrupt_handler() properly having got switched its readl()
from status to control register, the subsequent writel() needed to be
switched too (and the RW1C comment there was bogus).

Some of the cleanup went too far - undone.

Further, with iommu_interrupt_handler() now actually disabling the
interrupt sources, they also need to get re-enabled by the tasklet once
it finished processing the respective log. This also implies re-running
the tasklet so that log entries added between reading the log and re-
enabling the interrupt will get handled in a timely manner.

Finally, guest write emulation to the status register needs to be done
with the RW1C (and RO for all other bits) semantics in mind too.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Tim Deegan <tim@xen.org>
Acked-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
xen/drivers/passthrough/amd/iommu_cmd.c
xen/drivers/passthrough/amd/iommu_guest.c
xen/drivers/passthrough/amd/iommu_init.c
xen/include/asm-x86/hvm/svm/amd-iommu-defs.h